PostgreSQL 安全管理 最佳实践

在实际生产中, 应遵循以下规范 :

1 使用超级用户创建数据库,模式,应用所需的对象。

(如表,索引,函数)。

2 创建应用账号角色。

3 回收数据库,schema,language,应用对象的public权限。

    revoke all on database dbname from public;     
    revoke all on schema sch_name from public;     
    revoke all on language plpgsql from public;     
    revoke all on table ... from public;    
    revoke all on function ... from public;  

4 将数据库,schema的使用权限赋予给应用账号。

grant connect on database dbname to approle;    
|grant usage on schema sch_name to approle;  

5 将应用需要访问的对象的相关权限赋予给应用账号。

例如表的select,insert,update,delete权限, 函数的execute权限等.
这样,应用账号只有对象的使用权限,没有对象的DROP,TRUNCATE,REPLACE权限,相对来说是更安全的。

6 函数语言安全

建议回收函数语言的public权限,以及普通用户的权限,用户不能创建函数。执行online code。

revoke all on language plpgsql from public;    
revoke all on language plpgsql from app_role;   

7 防止执行不带条件的delete ,update。

例如,在需要保护的表里,新增一条dummy记录,创建行触发器,当这条记录被更新或删除时,抛出异常。
对于业务上不允许执行删除操作的表,不要赋予该表的delete权限给应用账号,也就不会有这个风险